package cn.openea.perpartner.meily.web.service;

import cn.openea.perpartner.common.core.web.domain.AjaxResult;
import cn.openea.perpartner.meily.web.entity.Goods;
import cn.openea.perpartner.meily.web.entity.GroupBuying;
import cn.openea.perpartner.meily.web.entity.GroupBuyingSub;
import cn.openea.perpartner.meily.web.entity.dto.GoodsSalesDataDTO;
import cn.openea.perpartner.meily.web.entity.dto.GroupBuyingSubDTOFactory;
import cn.openea.perpartner.meily.web.entity.dto.GroupDto;
import cn.openea.perpartner.meily.web.entity.vo.GroupBuyingSubEditVo;
import cn.openea.perpartner.meily.web.entity.vo.OrderRecordVo;
import cn.openea.perpartner.meily.web.entity.vo.OrderRefundVo;
import cn.openea.perpartner.meily.web.entity.vo.OrderSalesDataVo;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.IService;
import lombok.NonNull;

import java.text.ParseException;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;

/**
 * (GroupBuyingSub)表服务接口
 *
 * @author rains
 * @since 2023-02-07 17:11
 */
public interface IGroupBuyingSubService extends IService<GroupBuyingSub> {

    /**
     * 是否可参与团购
     *
     * @param groupDto 实例对象
     * @return 是否可参与
     */
    AjaxResult canJoin(GroupDto groupDto);

    /**
     * 参与团购
     *
     * @param groupBuyingSub 实例对象
     * @return 是否成功
     */
    AjaxResult join(GroupBuyingSub groupBuyingSub) throws ParseException;

    /**
     * 确认收货(更新记录状态)
     *
     * @param groupBuyingSub 实例对象
     * @return 更新结果
     */
    AjaxResult confirmReceipt(GroupBuyingSub groupBuyingSub);

    /**
     * 直接购买商品
     *
     * @param groupBuyingSub 实例对象
     * @return 是否成功
     */
    AjaxResult directPurchase(GroupBuyingSub groupBuyingSub) throws ParseException;

    /**
     * 确认收货(更新记录状态)-直接购买商品
     *
     * @param groupBuyingSub 实例对象
     * @return 更新结果
     */
    AjaxResult confirmReceipt2(GroupBuyingSub groupBuyingSub);


    /**
     * 获取参与团购记录详情
     *
     * @param groupDto 实例对象
     * @return 查询结果
     */
    AjaxResult getOrderDetails(GroupDto groupDto) throws ParseException;

    /**
     * 获取参与团购记录列表---分页
     *
     * @param groupDto 实例对象
     * @return 查询结果
     */
    List<GroupBuyingSub> getJoinRecordList(GroupDto groupDto) throws ParseException;

    /**
     * 给消费者发放分享报酬（根据分享验证id）
     *
     * @param shareValidationId 分享验证id
     * @return
     */
    AjaxResult sendShareRewardByVerificationId(String shareValidationId);

    /**
     * 保存分享图片路径
     *
     * @param object 实例对象
     * @return
     */
    AjaxResult saveSharePictureUrl(JSONObject object);

    /**
     * 获取分享海报地址
     *
     * @param object 实例对象
     * @return
     */
    AjaxResult getharePictureUrl(JSONObject object);

    /**
     * 首次打开分享发通知
     *
     * @param object 实例对象
     * @return
     */
    AjaxResult firstOpenShareSendMsg(JSONObject object);

    /**
     * 保存评价
     *
     * @param groupBuyingSub 实例对象
     * @return
     */
    boolean saveEvaluation(GroupBuyingSub groupBuyingSub);

    /**
     * 获取用户当前周期已购买商品的数量
     * @param groupBuyingSub
     * @return
     */
    long getQuantityByCurrentCycle(GroupBuyingSub groupBuyingSub);

    /**
     * 保存退款信息-暂时无用
     *
     * @param object 实例对象
     * @return
     */
    AjaxResult saveRefundInfo(JSONObject object);

    /**
     * 修改收货信息
     *
     * @param groupBuyingSub
     */
    AjaxResult modifyReceivingInfo(GroupBuyingSub groupBuyingSub);


    /**
     * 根据拼团主文档id获取所有参与团购记录-团销结算
     *
     * @param mainDocunid 拼团记录id
     * @return
     */
    List<GroupBuyingSub> getAllJoinList(String mainDocunid);

    /**
     * 获取当前周期下某商品的所有购买记录-团销结算
     *
     * @param goodsId  商品id
     * @param cyclicId 周期串
     * @return
     */
    List<GroupBuyingSub> getAllBuyingList(String goodsId, String cyclicId);

    /**
     * 获取购买商品数量-团销结算
     *
     * @param goodsId     商品id
     * @param cyclicId    周期串
     * @param mainDocunid 拼团记录id
     * @return
     */
    long getTotalBuyQuantity(String goodsId, String cyclicId, String mainDocunid);

    /**
     * 获取已完成的参与团购购买记录-团销结算
     *
     * @param goodsId     商品id
     * @param cyclicId    周期串
     * @param mainDocunid 拼团记录id
     * @return
     */
    List<GroupBuyingSub> getCompletedGroupRecordList(String goodsId, String cyclicId, String mainDocunid);

    /**
     * 获取拼团订单完成情况
     * 统计已完成、未完成、销售额
     *
     * @param groupBuying        拼团记录实体对象
     * @param distributionReward 线上服务商奖励
     */
    JSONObject getOrderCompletion(GroupBuying groupBuying, String distributionReward);

    /**
     * 获取分享标题
     *
     * @param groupBuying 拼团记录实体对象
     * @return
     */
    String getShareTitle(GroupBuying groupBuying);

    /**
     * 获取当前月已结束的拼团的所有参与记录
     *
     * @return
     */
    List<GroupBuyingSub> getCurrentMonthGroupFinishJoinList();

    /**
     * 获取上个月已结束的拼团的所有参与记录
     *
     * @return
     */
    List<GroupBuyingSub> getLastMonthGroupFinishJoinList();

    /**
     * meily-购买记录分页查询
     *
     * @param recordVo
     * @return
     */
    List<GroupBuyingSub> selectList(OrderRecordVo recordVo);

    /**
     * 物流更改通知
     *
     * @param groupBuyingSub 团购
     * @param action         动作 0 发货 1 该物流
     */
    void logisticsChangeNotify(@NonNull GroupBuyingSub groupBuyingSub, Goods goods, String action);

    /**
     * meily-团购订单数据更改
     *
     * @param editVo
     */
    void updateGroupBuyOrder(GroupBuyingSubEditVo editVo);

    /**
     * meily-更改订单收货地址
     *
     * @param id      id
     * @param address 收货地址 json串
     */
    void orderChangeAddress(String id, String address);

    /**
     * 获取订单的测试数据
     */
    List<GroupBuyingSub> selectTestOrderList();

    /**
     * 订单状态统计查询
     */
    Map<String, Integer> orderStatusCountQuery(OrderRecordVo recordVo);

    List<GroupBuyingSub> selectByIds(List<String> batchIds);

    List<GroupBuyingSub> selectByIdsAndOrderState(List<String> batchIds, String orderState);

    /**
     * 商品销售情况列表
     */
    List<GoodsSalesDataDTO> salesStatisticsList(OrderSalesDataVo salesDataVo);

    /**
     * 所有订单销售数据统计
     */
    Map<String, Object> statisticsAllGoodsSalesData(OrderSalesDataVo salesDataVo);

    void orderDelayedReceipt(String id, Integer days);

    /**
     * 距离收货时间48小时的数据
     * 是已收货的数据
     */
    List<GroupBuyingSub> findFortyEightHourData(OrderRecordVo recordVo);

    GroupBuyingSub findByOrderId(String orderId);

    /**
     * 退款
     */
    boolean refund(OrderRefundVo orderRefundVo);

    /**
     * 获取订单的销售佣金详情
     */
    GroupBuyingSubDTOFactory.SalesCommissionDTO findPurchaseCommissionDetailsById(GroupBuyingSub groupBuyingSub);

    /**
     * 根据时间区间查询
     * @return list
     */
    List<GroupBuyingSub> selectListByDateRange(LocalDate startDate, LocalDate endDate);

}
